package org.windey.client;

import java.awt.Checkbox;
import java.awt.Dimension;
import java.awt.Label;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;

/**
 * 
 * klasse om onze settings in een dialoogvenster weer te geven / invoeren
 *
 */
public class SettingsDialog extends JFrame{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 5453605185077249814L;
	
	/**
	 * we hebben 3 tabbladen == elk 1 panel en een panel om onze knoppen die we op elke tabblad tonen in te zetten
	 */
	private JPanel p1, p2, p3, onderaan ;
	/**
	 * om met tabbladen te werken
	 */
	private JTabbedPane jtp ;
	/**
	 * invoervelden
	 */
	private JTextField emailTextfield, poortTextfield, ipTextfield;
	/**
	 * speciaal invoerveld voor paswoord
	 */
	private JPasswordField paswoordTextfield ;
	/**
	 * een checkbox om bewaren van email + wachtwoord te doen naargelang wens gebruiker
	 */
	private Checkbox bewaarCheck ;
	/**
	 * settings om op te slagen van input
	 */
	private WindeySettings settings;
	
	/**
	 * 
	 * @param settings de reeds opgeslagen settings
	 */
	public SettingsDialog(WindeySettings settings)
	{
		this.settings = settings;
		setTitle("Settings") ;
		this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS)) ;
		jtp = new JTabbedPane() ;
		this.getContentPane().add(jtp) ;
		onderaan = new JPanel() ;
		this.getContentPane().add(onderaan) ;
		p1 = new JPanel() ;
		p2 = new JPanel() ;
		p3 = new JPanel() ;	
		maakp1() ;
		maakp2() ;
		maakp3() ;
		
		jtp.addTab("account", p1) ;
		jtp.addTab("instellingen", p2) ;
		jtp.addTab("server", p3) ;
		
		maakOnderaan() ;
		this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		//code om de close operation te overschrijven met ne actionlistener
		this.addWindowListener(new settingsDialogListener(this));
		this.setVisible(true) ;
		Toolkit t = Toolkit.getDefaultToolkit() ;
		Point p = new Point(t.getScreenSize().width - 400, t.getScreenSize().height - 400) ;
		this.setLocation(p) ;
		this.setSize(300,300) ;
		this.setResizable(false) ;
		loadSettings();
	}
	
	/**
	 * 
	 * hulpklasse
	 *
	 */
	class settingsDialogListener implements WindowListener
	{
		SettingsDialog d; 
	    public settingsDialogListener(SettingsDialog dialog)
	    {
			d = dialog ;
		}
		public void windowActivated(WindowEvent e) {}
		public void windowClosed(WindowEvent e) {}
		public void windowClosing(WindowEvent e) {d.setVisible(false);}
		public void windowDeactivated(WindowEvent e) {}
		public void windowDeiconified(WindowEvent e) {}
		public void windowIconified(WindowEvent e) {}
		public void windowOpened(WindowEvent e) {}
		
	}
	
	/**
	 * om de settings in te laden uit de bewaarde xml-file
	 */
	private void loadSettings()
	{
		emailTextfield.setText(settings.getEmail());
		paswoordTextfield.setText(settings.getPassword());
		bewaarCheck.setState(settings.getSavePassword());
		ipTextfield.setText(settings.getHostname());
		poortTextfield.setText(Integer.toString(settings.getPort()));
	}
	
	/**
	 * om het panel onderaan op te vullen
	 */
	private void maakOnderaan() {
		
		JButton b1 = new JButton("cancel") ;
		JButton b2 = new JButton("SAVE") ;
		
		b1.addActionListener(new actieCancel(this)) ;
		b2.addActionListener(new actieSave(this)) ;
		onderaan.add(b1) ;
		onderaan.add(b2) ;
	}

	/**
	 * 
	 * hulpklasse om aan de cancelknop een actie toe te kennen
	 *
	 */
	class actieCancel implements ActionListener
	{
		SettingsDialog d; 
	    public actieCancel(SettingsDialog dialog)
	    {
			d = dialog ;
		}

		public void actionPerformed(ActionEvent e)
		{
	    	d.setVisible(false) ;
	    }
	}
	
	/**
	 * 
	 * hulpklasse om aan de saveknop een actie toe te kennen
	 *
	 */
	class actieSave implements ActionListener 
	{
		SettingsDialog d; 
	    public actieSave(SettingsDialog dialog)
	    {
			d = dialog ;
		}
	    
		public void actionPerformed(ActionEvent e)
		{
			try
			{
				d.setVisible(false);
				if (bewaarCheck.getState()) {
					settings.setEmail(getEmailTextfield());
					settings.setPassword(getPaswoordTextfield());
					settings.setSavePassword(true);
				}
				else {
					settings.setEmail("");
					settings.setPassword("");
					settings.setSavePassword(false);
				}
				settings.setHostname(getIpTextfield());
				if (getPoortTextfield().equals("")) {
					settings.setPort(0);
				}
				else {
					settings.setPort(Integer.parseInt(getPoortTextfield()));
				}
				settings.saveSettings();
			}
			catch (SettingsException er)
			{
				d.setVisible(true);
				er.printStackTrace();
				JOptionPane.showMessageDialog(null, "Error saving settings", "Windey Client Error", JOptionPane.ERROR_MESSAGE);
			}
	    }
	}

	/**
	 * panel 1 maken
	 */
	private void maakp1() {
		p1.setLayout(new BoxLayout(p1, BoxLayout.Y_AXIS));
		
		JPanel hulp1 = new JPanel() ;
		JPanel hulp2 = new JPanel() ;
		JPanel hulp3 = new JPanel() ;
		hulp1.setLayout(new BoxLayout(hulp1,BoxLayout.X_AXIS)) ;
		hulp2.setLayout(new BoxLayout(hulp2,BoxLayout.X_AXIS)) ;
		hulp3.setLayout(new BoxLayout(hulp3,BoxLayout.X_AXIS)) ;
		
		Label l1 = new Label("email:") ;
		Label l2 = new Label("paswoord:") ;
		Label l3 = new Label("bewaar:") ;
		emailTextfield = new JTextField() ;
		paswoordTextfield = new JPasswordField();
		bewaarCheck = new Checkbox() ;
		
		Dimension d = new Dimension(75,25) ;
		l1.setMaximumSize(d) ;
		l2.setMaximumSize(d) ;
		l3.setMaximumSize(d) ;
		d = new Dimension(150,25) ;
		emailTextfield.setMaximumSize(d) ;
		paswoordTextfield.setMaximumSize(d) ;
		bewaarCheck.setMaximumSize(d) ;

		hulp1.add(l1) ;
		hulp1.add(emailTextfield) ;
		hulp2.add(l2) ;
		hulp2.add(paswoordTextfield) ;
		hulp3.add(l3) ;
		hulp3.add(bewaarCheck) ;
		p1.add(hulp1) ;
		p1.add(hulp2) ;
		p1.add(hulp3) ;
		
	}

	/**
	 * panel 2 maken
	 */
	private void maakp2() {

		JLabel temp = new JLabel() ;
		temp.setText("Voorlopig kan u nog niets instellen");
		p2.add(temp) ;
	}
	
	/**
	 * panel 3 maken
	 */
	private void maakp3() {
		p3.setLayout(new BoxLayout(p3, BoxLayout.Y_AXIS));
		
		JPanel hulp1 = new JPanel() ;
		JPanel hulp2 = new JPanel() ;
		hulp1.setLayout(new BoxLayout(hulp1,BoxLayout.X_AXIS)) ;
		hulp2.setLayout(new BoxLayout(hulp2,BoxLayout.X_AXIS)) ;
		
		Label l1 = new Label("ip:") ;
		Label l2 = new Label("poort:") ;

		ipTextfield = new JTextField();
		poortTextfield = new JTextField() ;

		
		Dimension d = new Dimension(75,25) ;
		l1.setMaximumSize(d) ;
		l2.setMaximumSize(d) ;
		d = new Dimension(150,25) ;
		ipTextfield.setMaximumSize(d) ;
		poortTextfield.setMaximumSize(d) ;


		hulp1.add(l1) ;
		hulp1.add(ipTextfield) ;
		hulp2.add(l2) ;
		hulp2.add(poortTextfield) ;
		p3.add(hulp1) ;
		p3.add(hulp2) ;

		
	}

	/**
	 * @return de ip die is ingevuld
	 */
	public String getIpTextfield() {
		return ipTextfield.getText();
	}
	
	/**
	 * 
	 * @return ingevulde emailadres
	 */
	public String getEmailTextfield() {
		return emailTextfield.getText();
	}	
	
	/**
	 * 
	 * @return ingevulde paswoord
	 */
	public String getPaswoordTextfield() {
		return new String(paswoordTextfield.getPassword());
	}	
	
	/**
	 * 
	 * @return ingevulde poort
	 */
	public String getPoortTextfield() {
		return poortTextfield.getText() ;
	}
	
	/**
	 * 
	 * @return of bewaar is aangevinkt of niet
	 */
	public Boolean getBewaarCheck() {
		return bewaarCheck.getState() ;
	}

}
